package com.example.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.Result;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

@Api(tags = "用户访问接口")
@RestController
@CrossOrigin
@RequestMapping("/api/user")
public class UserController {
    @Autowired
    private UserMapper usermapper;

    @ApiOperation(value = "获取所有用户信息")
    @GetMapping("/info")
    public Result<?> selectAll(){
        List list = usermapper.selectList(null);
        if(!list.isEmpty()) {
            return Result.success(list);
        } else {
            return Result.error("404", "找不到用户信息！");
        }
    }

    @ApiOperation(value = "按页数获取用户信息")
    @GetMapping("/info/page")
    public Result<?> selectByPage(@RequestParam(defaultValue = "1") int num, @RequestParam(defaultValue = "10") int size, @RequestParam(defaultValue = "") String str){
        LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery();
        if (!Objects.equals(str, "")){
            wrapper.like(User::getName, str).or().like(User::getTel, str).or().like(User::getId, str);
        }
        Page page = usermapper.selectPage(new Page<>(num, size), wrapper);

        if(!page.getRecords().isEmpty()) {
            return Result.success(page);
        } else {
            return Result.error("404", "找不到用户信息！");
        }
    }

    @ApiOperation(value = "用户账号登陆")
    @GetMapping("/login/byid")
    // 后端请求地址
    public Result<?> selectLoginId(@RequestParam int id,
                                   @RequestParam String pwd){
        if(String.valueOf(id).equals("") || pwd == null){
            // 判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }
        User user = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getId, id).eq(User::getPwd, pwd));
        // 建立对数据库的查询，查询账号和密码同时与参数相等的用户
        if(user != null) {
            // 判断是否查询到用户
            return Result.success(user);
            // 返回成功败信息
        } else {
            return Result.error("-1", "账号或密码错误！");
            // 返回失败信息
        }
    }

    @ApiOperation(value = "用户手机号登陆")
    @GetMapping("/login/bytel")
    public Result<?> selectLoginTel(@RequestParam String tel, @RequestParam String pwd){
        if(tel == null || pwd == null){
            return Result.error("401", "参数不能为空！");
        }
        User user = usermapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getTel, tel).eq(User::getPwd, pwd));
        if(user != null) {
            return Result.success(user);
        } else {
            return Result.error("-1", "手机号或密码错误！");
        }
    }

    @ApiOperation(value = "根据用户id获取用户信息")
    @GetMapping("/info/byid")
    public Result<?> selectById(@RequestParam int id){
        if(String.valueOf(id).equals("")){
            return Result.error("401", "参数不能为空！");
        }
        User user = usermapper.selectById(id);
        if(user != null) {
            return Result.success(user);
        } else {
            return Result.error("404", "找不到用户信息！");
        }
    }

    @ApiOperation(value = "根据手机号获取用户信息")
    @GetMapping("/info/bytel")
    public Result<?> selectByTel(@RequestParam String tel){
        if(tel == null){
            return Result.error("401", "参数不能为空！");
        }
        User user = usermapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getTel, tel));
        if(user != null) {
            return Result.success(user);
        } else {
            return Result.error("404", "找不到用户信息！");
        }
    }

    @ApiOperation(value = "根据用户类型获取用户信息")
    @GetMapping("/info/bytype")
    public Result<?> selectByType(@RequestParam int type) {
        if(String.valueOf(type).equals("")){
            return Result.error("401", "参数不能为空！");
        }
        List list = usermapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getType, type));
        if (!list.isEmpty()) {
            return Result.success(list);
        } else {
            return Result.error("404", "找不到用户信息！");
        }
    }

    @ApiOperation(value = "根据用户信息获取管理员权限")
    @GetMapping("/info/admin")
    // 后端请求地址
    public Result<?> selectAdmin(User user) {
        if(String.valueOf(user.getId()).equals("") || user.getName() == null
                || user.getPwd() == null || user.getTel() == null){ //判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }
        User user1 = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getId, user.getId()).eq(User::getName, user.getName())
                .eq(User::getTel, user.getTel()).eq(User::getPwd, user.getPwd()));
        // 获取该用户信息
        if (user1 != null && user1.getType() != 0) { // 判断是否是管理员
            return Result.success();
            // 返回成功信息
        } else {
            return Result.error("101", "不是管理员！");
            // 返回失败信息
        }
    }

    @ApiOperation(value = "添加用户信息")
    @PostMapping("")
    // 后端请求地址
    public Result<?> insert(User user) {
        user.setType(0);
        // 用户注册接口，只能注册为普通用户
        if(user.getName() == null || user.getPwd() == null || user.getTel() == null){
            // 判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }
        if((usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getTel, user.getTel()))) != null) {
            // 判断手机号是否已存在
            return Result.error("-101", "手机号已存在！");
            // 返回失败信息
        }
        // 新增用户信息并返回布尔值
        if(usermapper.insert(user) > 0) {
            // 新增用户信息并判断是否成功
            User users = usermapper.selectOne(Wrappers.<User>lambdaQuery().
                    eq(User::getTel, user.getTel()));
            // 获取数据库中的用户信息
            return Result.success(users);
            // 返回成功信息
        } else {
            return Result.error("-1", "添加用户失败！");
            // 返回失败信息
        }
    }


    @ApiOperation(value = "管理员根据用户id添加用户信息")
    @PostMapping("admin")
    // 后端请求地址
    public Result<?> insertAdmin(User user, @RequestParam String name2, @RequestParam String tel2,
                                 @RequestParam String pwd2, @RequestParam int type2){
        if(String.valueOf(user.getId()).equals("") || user.getName() == null
                || user.getPwd() == null || user.getTel() == null
                || String.valueOf(type2).equals("") || name2 == null
                || pwd2 == null || tel2 == null){
            // 判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }
        User user1 = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getId, user.getId()).eq(User::getName, user.getName())
                .eq(User::getTel, user.getTel()).eq(User::getPwd, user.getPwd()));
        // 获取该用户信息
        if (user1 != null && user1.getType() != 0) { // 判断是否是管理员
            User user2 = new User();
            user2.setName(name2);
            user2.setTel(tel2);
            user2.setPwd(pwd2);
            user2.setType(type2);

            if((usermapper.selectOne(Wrappers.<User>lambdaQuery()
                    .eq(User::getTel, user2.getTel()))) != null) {
                // 判断手机号是否已存在
                return Result.error("-101", "手机号已存在！");
                // 返回失败信息
            }
            // 新增用户信息并返回布尔值
            if(usermapper.insert(user2) > 0) {
                // 新增用户信息并判断是否成功
                User users = usermapper.selectOne(Wrappers.<User>lambdaQuery().
                        eq(User::getTel, user2.getTel()));
                // 获取数据库中的用户信息
                return Result.success(users);
                // 返回成功信息
            } else {
                return Result.error("-1", "添加用户失败！");
                // 返回失败信息
            }
        } else {
            return Result.error("101", "不是管理员！");
            // 返回失败信息
        }
    }


    @ApiOperation(value = "根据用户id删除用户信息")
    @DeleteMapping("")
    // 后端请求地址
    public Result<?> delete(@RequestParam int id){
        if(String.valueOf(id).equals("")){
            return Result.error("401", "参数不能为空！");
        }
        boolean bool = (usermapper.deleteById(id) > 0);
        if(bool) {
            return Result.success();
        } else {
            return Result.error("-1", "删除用户失败！");
        }
    }


    @ApiOperation(value = "管理员根据用户id删除用户信息")
    @DeleteMapping("admin")
    // 后端请求地址
    public Result<?> deleteAdmin(User user, @RequestParam int id2){
        if(String.valueOf(user.getId()).equals("") || user.getName() == null
                || user.getPwd() == null || user.getTel() == null || String.valueOf(id2).equals("")){
            // 判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }
        User user1 = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getId, user.getId()).eq(User::getName, user.getName())
                .eq(User::getTel, user.getTel()).eq(User::getPwd, user.getPwd()));
        // 获取该用户信息
        if (user1 != null && user1.getType() != 0) { // 判断是否是管理员
            if(usermapper.deleteById(id2) > 0) { // 判断是否是删除成功
                return Result.success();
                // 返回成功信息
            } else {
                return Result.error("-1", "删除用户失败！");
                // 返回失败信息
            }
        } else {
            return Result.error("101", "不是管理员！");
            // 返回失败信息
        }
    }


    @ApiOperation(value = "管理员根据用户id更新用户信息")
    @PutMapping("admin")
    // 后端请求地址
    public Result<?> updateAdmin(User user,@RequestParam int id2, @RequestParam String name2,
                            @RequestParam String tel2, @RequestParam String pwd2, 
                            @RequestParam int type2, @RequestParam String pwd3) {
        User user2 = new User();
        user2.setId(id2);
        user2.setName(name2);
        user2.setTel(tel2);
        user2.setPwd(pwd2);
        user2.setType(type2);
        if(String.valueOf(user.getId()).equals("") || user.getName() == null || user.getPwd() == null ||
                user.getTel() == null || String.valueOf(user.getType()).equals("") ||
                String.valueOf(user2.getId()).equals("") || user2.getName() == null || user2.getPwd() == null ||
                user2.getTel() == null || String.valueOf(user2.getType()).equals("") || pwd3 == null){
            // 判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }

        User user1 = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getId, user.getId()).eq(User::getName, user.getName())
                .eq(User::getTel, user.getTel()).eq(User::getPwd, user.getPwd()));
        // 获取该用户信息
        if (user1 != null && user1.getType() != 0) { // 判断是否是管理员
            if(usermapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getId, user2.getId())
                    .eq(User::getPwd, pwd3)) == null) {
                // 判断原用户信息是否正确
                return Result.error("-101", "用户数据错误！");
                // 返回失败信息
            }

            user1 = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                    .eq(User::getTel, user2.getTel()));
            if(user1 != null && user2.getId() != user1.getId()) {
                // 判断手机号是否已存在
                return Result.error("-101", "手机号已存在！");
                // 返回失败信息
            }

            if(usermapper.updateById(user2) > 0) {
                // 更新用户信息并判断是否成功
                return Result.success();
                // 返回成功信息
            } else {
                return Result.error("-1", "更新用户失败！");
                // 返回失败信息
            }
        } else {
            return Result.error("101", "不是管理员！");
            // 返回失败信息
        }
    }
    
    
    @ApiOperation(value = "根据用户id更新用户信息")
    @PutMapping("")
    // 后端请求地址
    public Result<?> update(User user, String pwd2) {
        if(String.valueOf(user.getId()).equals("") || user.getName() == null ||
                user.getPwd() == null || user.getTel() == null || pwd2 == null){
            // 判断接收参数是否为空
            return Result.error("401", "参数不能为空！");
            // 返回失败信息
        }
        if(usermapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getId, user.getId())
                .eq(User::getPwd, pwd2).eq(User::getType, user.getType())) == null) {
            // 判断原用户信息是否正确
            return Result.error("-101", "用户数据错误！");
            // 返回失败信息
        }
        User user1 = usermapper.selectOne(Wrappers.<User>lambdaQuery()
                .eq(User::getTel, user.getTel()));
        if(user1 != null && user.getId() != user1.getId()) {
            // 判断手机号是否已存在
            return Result.error("-101", "手机号已存在！");
            // 返回失败信息
        }
        if(usermapper.updateById(user) > 0) {
            // 更新用户信息并判断是否成功
            return Result.success();
            // 返回成功信息
        } else {
            return Result.error("-1", "更新用户失败！");
            // 返回失败信息
        }
    }
}